package main

import "fmt"

func main() {
	// 跳出多层循环

	// for i := 0; i < 3; i++ {
	// 	for j := 'A'; j < 'Z'; j++ {
	// 		if j == 'C' {
	// 			break
	// 		}
	// 		fmt.Printf("i=%d j=%c\n", i, j)
	// 	}
	// }
	/*
		运行结果（只是跳出了内层循环）：
		i=0 j=A
		i=0 j=B
		i=1 j=A
		i=1 j=B
		i=2 j=A
		i=2 j=B
	*/

	var flag = false
	for i := 0; i < 3; i++ {
		for j := 'A'; j < 'Z'; j++ {
			if j == 'C' {
				flag = true
				break
			}
			fmt.Printf("i=%d j=%c\n", i, j)
		}
		if flag {
			break
		}
	}
	/*
		运行结果：
			i=0 j=A
			i=0 j=B
	*/

	// goto+label实现
	for i := 0; i < 3; i++ {
		for j := 'A'; j < 'Z'; j++ {
			if j == 'C' {
				goto XX // 跳到指定标签
			}
			fmt.Printf("i=%d j=%c\n", i, j)
		}
	}
XX: // label标签
	fmt.Println("over")
	/*
		运行结果：
			i=0 j=A
			i=0 j=B
			over
	*/

	// break推出指定标签对应的代码块，标签要求必须定义在for 、switch、和select代码块上
BREAKDEMO1:
	for i := 0; i < 3; i++ {
		for j := 'A'; j < 'Z'; j++ {
			if j == 'C' {
				break BREAKDEMO1
			}
			fmt.Printf("i=%d j=%c\n", i, j)
		}
	}
	fmt.Println("over")
	/*
		运行结果：
			i=0 j=A
			i=0 j=B
			ove
	*/

	// contine 结束当前循环，继续下次循环，仅限在for循环内使用
forloop1:
	for i := 0; i < 5; i++ {
		for j := 0; j < 3; j++ {
			if i == 2 && j == 2 {
				continue forloop1
			}
			fmt.Printf("i=%d j=%d\n", i, j)
		}
	}
	/*
		运行结果：
			...
			i=2 j=0
			i=2 j=1
			i=3 j=0
			i=3 j=1
			i=3 j=2
			...
	*/
}
